/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * RegistroModeloEjes.java
 *
 * Created on 05-may-2012, 18:31:39
 */
package com.camachosanchez.gui;

import com.camachosanchez.bean.Ejes;
import com.camachosanchez.bean.FuncionEje;
import com.camachosanchez.bean.TiposEje;
import com.camachosanchez.bean.TiposVehiculo;
import com.camachosanchez.controler.jdbc.TipoEjeJdbcControler;
import com.camachosanchez.controler.jpa.FuncionEjeJpaController;
import com.camachosanchez.controler.jpa.TiposVehiculoJpaController;
import com.camachosanchez.gui.combo.MyComboBoxEditor;
import com.camachosanchez.gui.combo.MyComboBoxRenderer;
import com.camachosanchez.gui.table.RenderizadorTablaModeloEjes;
import com.camachosanchez.gui.textfield.MaxLengthTextDocument;
import com.camachosanchez.util.Constantes;
import com.camachosanchez.util.GUIUtil;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.SQLUtil;
import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 *
 * @author Rolando
 */
public class RegistroModeloEjes extends javax.swing.JDialog implements FocusListener {

    private EntityManagerFactory emf = null;
    private DefaultTableModel dm;
    private String[] funciones;
    private JTextField textFieldCodigo;
    private MaxLengthTextDocument doc_cantidad;
    private MaestroModeloEjes maestro = null;

    /**
     * Creates new form RegistroModeloEjes
     */
    public RegistroModeloEjes(java.awt.Frame parent, MaestroModeloEjes maestro, boolean modal) {
        super(parent, modal);
        initComponents();
        this.maestro = maestro;
        this.emf = JPAUtil.getEntityManagerFactory();
        FuncionEjeJpaController funcion_dao = new FuncionEjeJpaController(null);
        List<FuncionEje> f = funcion_dao.findFuncionEjeEntities();
        funciones = new String[f.size()];
        int i = 0;
        for (FuncionEje funcionEje : f) {
            funciones[i++] = funcionEje.getNombre();
        }
        GUIUtil.addEscapeKey(this);
        tblEjes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        dm = new DefaultTableModel() {

            @Override
            public boolean isCellEditable(int row, int col) {
                return col != 0;
            }

            @Override
            public Class getColumnClass(int c) {
                return String.class;
            }
        };
        Object[] columns = new Object[]{"EJE", "NÚM. NEUMÁTICOS", "FUNCIÓN"};
        dm.setColumnIdentifiers(columns);
        tblEjes.setModel(dm);
        tblEjes.setFillsViewportHeight(true);
//        tblEjes.setRowHeight(20);
//        tblEjes.getColumnModel().getColumn(0).setCellRenderer(tblEjes.getTableHeader().getDefaultRenderer());
        TableColumn col = tblEjes.getColumnModel().getColumn(2);
        col.setCellEditor(new MyComboBoxEditor(funciones));
        col.setCellRenderer(new MyComboBoxRenderer(funciones));
        setAnchoColumnas();
        setLocationRelativeTo(null);
        setModal(modal);
        MaxLengthTextDocument doc_nombre = new MaxLengthTextDocument();
        doc_nombre.setMaxChars(40, Constantes.ANY);

        doc_cantidad = new MaxLengthTextDocument();
        doc_cantidad.setMaxChars(2, Constantes.ENTEROS);
        textFieldCodigo = new JTextField();
        textFieldCodigo.setDocument(doc_cantidad);

        txtNombre.setDocument(doc_nombre);
        TiposVehiculoJpaController tipos_vehiculo_dao = new TiposVehiculoJpaController(null);
        List<TiposVehiculo> tipos_vehiculos = tipos_vehiculo_dao.findTiposVehiculoEntities();
        cmbUnidad.setModel(new DefaultComboBoxModel(tipos_vehiculos.toArray()));
        //EVENTOS DE LA TABLA
        establecerEventosTeclas();
        tblEjes.getTableHeader().setReorderingAllowed(false);
        DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) tblEjes.getTableHeader().getDefaultRenderer();
        renderer.setHorizontalAlignment(JLabel.CENTER);
        RenderizadorTablaModeloEjes render = new RenderizadorTablaModeloEjes();
        tblEjes.setDefaultRenderer(Object.class, render);
        GUIUtil.SetAnchoColumnas(tblEjes);
    }

    private void establecerEventosTeclas() {
        TableColumn columnaCodigo = tblEjes.getColumnModel().getColumn(1);
        textFieldCodigo.addFocusListener(this);
//        textFieldCodigo.setBorder(BorderFactory.createEmptyBorder());
        textFieldCodigo.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 3));
        textFieldCodigo.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        DefaultCellEditor singleclickCodigo = new DefaultCellEditor(
                textFieldCodigo);
        singleclickCodigo.setClickCountToStart(1);
        columnaCodigo.setCellEditor(singleclickCodigo);
    }

    private void setAnchoColumnas() {
        int anchoColumna;
        TableColumnModel modeloColumna = tblEjes.getColumnModel();
        TableColumn columnaTabla;
        for (int i = 0; i < tblEjes.getColumnCount(); i++) {
            columnaTabla = modeloColumna.getColumn(i);
            switch (i) {
                case 0:
                    anchoColumna = 40;
                    columnaTabla.setMinWidth(anchoColumna);
                    columnaTabla.setMaxWidth(anchoColumna);
                    columnaTabla.setPreferredWidth(anchoColumna);
                    break;
                case 1:
                    anchoColumna = 120;
                    columnaTabla.setMinWidth(anchoColumna);
                    columnaTabla.setMaxWidth(anchoColumna);
                    columnaTabla.setPreferredWidth(anchoColumna);
                    break;
            }
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        toolBarPrincipal = new javax.swing.JToolBar();
        pnlToolBar = new javax.swing.JPanel();
        btnNuevo = new javax.swing.JButton();
        btnGuardar = new javax.swing.JButton();
        pnlContenedor = new javax.swing.JPanel();
        pnlDatos = new javax.swing.JPanel();
        lblNombre = new javax.swing.JLabel();
        txtNombre = new javax.swing.JTextField();
        tbpComentarios = new javax.swing.JTabbedPane();
        pnlComentarios = new javax.swing.JPanel();
        scrComentarios = new javax.swing.JScrollPane();
        txpComentarios = new javax.swing.JTextPane();
        pnlTablaEjes = new javax.swing.JPanel();
        pnlOpciones = new javax.swing.JPanel();
        btnAgregar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        btlLimpiar = new javax.swing.JButton();
        scrTablaEjes = new javax.swing.JScrollPane();
        tblEjes = new javax.swing.JTable();
        lblUnidad = new javax.swing.JLabel();
        cmbUnidad = new javax.swing.JComboBox();
        lblImagenLateral = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(".:: Modelo de Eje ::.");
        setResizable(false);

        toolBarPrincipal.setBackground(new java.awt.Color(204, 204, 255));
        toolBarPrincipal.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        toolBarPrincipal.setFloatable(false);
        toolBarPrincipal.setRollover(true);
        toolBarPrincipal.setOpaque(false);

        pnlToolBar.setBackground(new java.awt.Color(255, 255, 255));
        pnlToolBar.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        btnNuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/24_new.png"))); // NOI18N
        btnNuevo.setToolTipText("Nuevo");
        btnNuevo.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnNuevo.setFocusable(false);
        btnNuevo.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        btnNuevo.setMaximumSize(new java.awt.Dimension(22, 22));
        btnNuevo.setMinimumSize(new java.awt.Dimension(22, 22));
        btnNuevo.setPreferredSize(new java.awt.Dimension(22, 22));
        btnNuevo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoActionPerformed(evt);
            }
        });
        pnlToolBar.add(btnNuevo);

        btnGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/24_save.png"))); // NOI18N
        btnGuardar.setToolTipText("Guardar");
        btnGuardar.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGuardar.setFocusable(false);
        btnGuardar.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        btnGuardar.setMaximumSize(new java.awt.Dimension(22, 22));
        btnGuardar.setMinimumSize(new java.awt.Dimension(22, 22));
        btnGuardar.setPreferredSize(new java.awt.Dimension(22, 22));
        btnGuardar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });
        pnlToolBar.add(btnGuardar);

        toolBarPrincipal.add(pnlToolBar);

        getContentPane().add(toolBarPrincipal, java.awt.BorderLayout.PAGE_START);

        pnlContenedor.setBackground(new java.awt.Color(255, 255, 255));
        pnlContenedor.setLayout(new java.awt.BorderLayout());

        pnlDatos.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        pnlDatos.setMaximumSize(new java.awt.Dimension(32767, 350));

        lblNombre.setText("<html>Nombre: <font color=\"red\">(*)</font> </html>");

        tbpComentarios.setBackground(new java.awt.Color(188, 211, 226));

        pnlComentarios.setLayout(new java.awt.BorderLayout());

        scrComentarios.setBorder(null);

        txpComentarios.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        scrComentarios.setViewportView(txpComentarios);

        pnlComentarios.add(scrComentarios, java.awt.BorderLayout.CENTER);

        tbpComentarios.addTab("Comentarios", pnlComentarios);

        pnlTablaEjes.setOpaque(false);
        pnlTablaEjes.setLayout(new java.awt.BorderLayout(2, 0));

        pnlOpciones.setOpaque(false);
        pnlOpciones.setLayout(new javax.swing.BoxLayout(pnlOpciones, javax.swing.BoxLayout.PAGE_AXIS));

        btnAgregar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/12_add.png"))); // NOI18N
        btnAgregar.setToolTipText("Agregar");
        btnAgregar.setBorder(null);
        btnAgregar.setOpaque(false);
        btnAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarActionPerformed(evt);
            }
        });
        pnlOpciones.add(btnAgregar);

        btnEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/12_delete.png"))); // NOI18N
        btnEliminar.setToolTipText("Eliminar");
        btnEliminar.setBorder(null);
        btnEliminar.setOpaque(false);
        btnEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarActionPerformed(evt);
            }
        });
        pnlOpciones.add(btnEliminar);

        btlLimpiar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/12_clear.png"))); // NOI18N
        btlLimpiar.setToolTipText("Limpiar");
        btlLimpiar.setBorder(null);
        btlLimpiar.setOpaque(false);
        btlLimpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btlLimpiarActionPerformed(evt);
            }
        });
        pnlOpciones.add(btlLimpiar);

        pnlTablaEjes.add(pnlOpciones, java.awt.BorderLayout.LINE_END);

        tblEjes.setBackground(new java.awt.Color(240, 240, 240));
        tblEjes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tblEjes.setRowHeight(22);
        scrTablaEjes.setViewportView(tblEjes);

        pnlTablaEjes.add(scrTablaEjes, java.awt.BorderLayout.CENTER);

        lblUnidad.setText("Unidad:");

        cmbUnidad.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        javax.swing.GroupLayout pnlDatosLayout = new javax.swing.GroupLayout(pnlDatos);
        pnlDatos.setLayout(pnlDatosLayout);
        pnlDatosLayout.setHorizontalGroup(
            pnlDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlDatosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pnlDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(pnlTablaEjes, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
                    .addComponent(tbpComentarios, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnlDatosLayout.createSequentialGroup()
                        .addComponent(lblNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblUnidad, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmbUnidad, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        pnlDatosLayout.setVerticalGroup(
            pnlDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlDatosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pnlDatosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblUnidad)
                    .addComponent(cmbUnidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(pnlTablaEjes, javax.swing.GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tbpComentarios, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pnlContenedor.add(pnlDatos, java.awt.BorderLayout.CENTER);

        getContentPane().add(pnlContenedor, java.awt.BorderLayout.CENTER);

        lblImagenLateral.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/chasis_lateral.png"))); // NOI18N
        getContentPane().add(lblImagenLateral, java.awt.BorderLayout.LINE_START);

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void btnAgregarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarActionPerformed
// TODO add your handling code here:
    if (tblEjes.getCellEditor() != null) {
        tblEjes.getCellEditor().stopCellEditing();
    }
    Object[] obj = new Object[3];
    obj[0] = dm.getRowCount() + 1;
    obj[1] = "2";
    obj[2] = funciones[0];
    dm.addRow(obj);
    GUIUtil.SetAnchoColumnas(tblEjes);
}//GEN-LAST:event_btnAgregarActionPerformed

private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarActionPerformed
// TODO add your handling code here:
    if (tblEjes.getCellEditor() != null) {
        tblEjes.getCellEditor().stopCellEditing();
    }
    if (dm.getRowCount() > 0) {
        dm.removeRow(dm.getRowCount() - 1);
        GUIUtil.SetAnchoColumnas(tblEjes);
    }
}//GEN-LAST:event_btnEliminarActionPerformed

private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed
// TODO add your handling code here:
    EntityManager em = null;
    try {
        if (tblEjes.getCellEditor() != null) {
            tblEjes.getCellEditor().stopCellEditing();
        }
        em = emf.createEntityManager();
//        EntityTransaction tx = em.getTransaction();
        em.getTransaction().begin();
        String nombre = txtNombre.getText().trim();
        TipoEjeJdbcControler doaJdbc = new TipoEjeJdbcControler();
        if (doaJdbc.existeTipoEje(nombre) == 0) {
            if (!nombre.isEmpty()) {
                if (nombre.length() <= 40) {
                    TiposEje tipo_eje = new TiposEje();
                    tipo_eje.setNombre(nombre);
                    tipo_eje.setDescripcion(txpComentarios.getText());
                    tipo_eje.setIdTipoVehiculo((TiposVehiculo) cmbUnidad.getSelectedItem());
                    List<Ejes> ejes = new ArrayList<Ejes>();
                    int posicion;
                    int numero_neumaticos;
                    FuncionEje funcion;
                    for (int i = 0; i < dm.getRowCount(); i++) {
                        Ejes eje = new Ejes();
                        try {
                            posicion = Integer.parseInt(dm.getValueAt(i, 0).toString());
                        } catch (NumberFormatException ex) {
                            JOptionPane.showMessageDialog(this, "Los ejes deben ser valores numéricos.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        try {
                            numero_neumaticos = Integer.parseInt(dm.getValueAt(i, 1).toString());
                        } catch (NumberFormatException ex) {
                            JOptionPane.showMessageDialog(this, "El número de neumáticos por eje debe ser un valor numérico.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        if (numero_neumaticos < 2 || numero_neumaticos % 2 != 0) {
                            JOptionPane.showMessageDialog(this, "El número de neumáticos por eje debe ser un número par.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        String funcion_nombre = dm.getValueAt(i, 2).toString();
                        funcion = SQLUtil.buscarPorNombreFuncionEje(funcion_nombre);
                        if (funcion == null) {
                            JOptionPane.showMessageDialog(this, "La función asignada al eje es incorrecta.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                            return;
                        }
                        eje.setPosicion(posicion);
                        eje.setNumNeumaticos(numero_neumaticos);
                        eje.setIdFuncion(funcion);
                        ejes.add(eje);
                    }
                    if (ejes.isEmpty()) {
                        JOptionPane.showMessageDialog(this, "Inserte ejes al modelo.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                        return;
                    }
                    for (Ejes e : ejes) {
                        e.setIdEje(tipo_eje);
                    }
                    tipo_eje.setEjesList(ejes);
                    tipo_eje.setActivo(true);
                    tipo_eje.setEstado(true);
                    em.persist(tipo_eje);
//                    em.merge(tipo_eje);
                    em.flush();
                    em.refresh(tipo_eje);
//                    TiposEjeJpaController daoTipo = new TiposEjeJpaController(null);
//                    daoTipo.create(tipo_eje);
                    em.getTransaction().commit();
//                    EjesJpaController de = new EjesJpaController(null);
//                    for (Ejes e : ejes) {
//                        e.setIdEje(tipo_eje);
//                        de.create(e);
//                    }

                    JOptionPane.showMessageDialog(this, "El modelo ha sido guardado correctamente.", "Operación finalizada", JOptionPane.INFORMATION_MESSAGE);
                    dispose();
                    if (maestro != null) {
                        maestro.llenarModelosEjes();
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "El nombre del modelo debe tener menos de 40 caracteres.", Constantes.DATOS_INCORRECTOS, JOptionPane.WARNING_MESSAGE);
                    txtNombre.requestFocusInWindow();
                    return;
                }
            } else {
                JOptionPane.showMessageDialog(this, Constantes.NOMBRE_MODELO_REQUERIDO, Constantes.DATOS_INCOMPLETOS, JOptionPane.WARNING_MESSAGE);
                txtNombre.requestFocusInWindow();
                return;
            }
        } else {
            JOptionPane.showMessageDialog(this, "El nombre asignado al modelo ya existe.", Constantes.DATOS_INCOMPLETOS, JOptionPane.WARNING_MESSAGE);
            txtNombre.requestFocusInWindow();
        }
    } catch (Exception e) {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        JOptionPane.showMessageDialog(Principal.getInstance(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
    } finally {
        if (em != null) {
            em.close();
        }
    }
}//GEN-LAST:event_btnGuardarActionPerformed

    private void btlLimpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btlLimpiarActionPerformed
        // TODO add your handling code here:
        if (tblEjes.getCellEditor() != null) {
            tblEjes.getCellEditor().stopCellEditing();
        }
        dm.setRowCount(0);
        GUIUtil.SetAnchoColumnas(tblEjes);
    }//GEN-LAST:event_btlLimpiarActionPerformed

    private void btnNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoActionPerformed
        // TODO add your handling code here:
        if (tblEjes.getCellEditor() != null) {
            tblEjes.getCellEditor().stopCellEditing();
        }
        GUIUtil.limpiarVentana(this.getRootPane().getComponents());
        while (dm.getRowCount() > 0) {
            dm.removeRow(0);
        }
        txpComentarios.setText("");
        txtNombre.requestFocusInWindow();
    }//GEN-LAST:event_btnNuevoActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btlLimpiar;
    private javax.swing.JButton btnAgregar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnGuardar;
    private javax.swing.JButton btnNuevo;
    private javax.swing.JComboBox cmbUnidad;
    private javax.swing.JLabel lblImagenLateral;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblUnidad;
    private javax.swing.JPanel pnlComentarios;
    private javax.swing.JPanel pnlContenedor;
    private javax.swing.JPanel pnlDatos;
    private javax.swing.JPanel pnlOpciones;
    private javax.swing.JPanel pnlTablaEjes;
    private javax.swing.JPanel pnlToolBar;
    private javax.swing.JScrollPane scrComentarios;
    private javax.swing.JScrollPane scrTablaEjes;
    private javax.swing.JTable tblEjes;
    private javax.swing.JTabbedPane tbpComentarios;
    private javax.swing.JToolBar toolBarPrincipal;
    private javax.swing.JTextPane txpComentarios;
    private javax.swing.JTextField txtNombre;
    // End of variables declaration//GEN-END:variables

    @Override
    public void focusGained(FocusEvent e) {
        if (e.getSource() == textFieldCodigo) {
            textFieldCodigo.setBackground(new Color(255, 251, 170));
            textFieldCodigo.requestFocusInWindow();
            textFieldCodigo.setEditable(true);
            textFieldCodigo.selectAll();
        }
    }

    @Override
    public void focusLost(FocusEvent e) {
    }
}
